www.gusucode.com > C++ QQ农场源代码程序 > C++ QQ农场源代码程序/code/qq农场源代码/qq农场源代码/ULHook.cpp

    ///////////////////////////////////////////
// ULHook.cpp文件

#include "stdafx.h"
#include "ULHook.h"

CULHook::CULHook( )
{
	::InitializeCriticalSection(&m_cs);
	
} 
CULHook::~CULHook()
{
	::DeleteCriticalSection(&m_cs);
	Unhook();
	if(m_hModule != NULL)
		::FreeLibrary(m_hModule);
}

void CULHook::Unhook()
{
	Lock();
	if(m_pfnOrig != NULL)
	{
		DWORD dwOldProtect;
		MEMORY_BASIC_INFORMATION    mbi;
		::VirtualQuery(m_pfnOrig, &mbi, sizeof(mbi));
		::VirtualProtect(m_pfnOrig, HOOKLEN, PAGE_READWRITE, &dwOldProtect);
		
		::WriteProcessMemory(::GetCurrentProcess(), (void *)m_pfnOrig, 
			m_btOldBytes, sizeof(DWORD)*2, NULL); 
		
		::VirtualProtect(m_pfnOrig, HOOKLEN, mbi.Protect, 0);
	}
}


void CULHook::Rehook()
{
	
	if(m_pfnOrig != NULL)
	{
		DWORD dwOldProtect;
		MEMORY_BASIC_INFORMATION    mbi;
		::VirtualQuery( m_pfnOrig, &mbi, sizeof(mbi) );
		::VirtualProtect(m_pfnOrig, HOOKLEN, PAGE_READWRITE, &dwOldProtect);
		::WriteProcessMemory(::GetCurrentProcess(), (void *)m_pfnOrig, 
			m_btNewBytes, HOOKLEN, NULL); 
		::VirtualProtect(m_pfnOrig, HOOKLEN, mbi.Protect, 0);
	}
	
	UnLock();
}


void CULHook::Lock()
{
	::EnterCriticalSection(&m_cs);
	
}

void CULHook::UnLock()
{
	
	::LeaveCriticalSection(&m_cs);
}

void CULHook::SetAPIHook(LPSTR pszModName, LPSTR pszFuncName, PROC pfnHook)
{ 
	
	//////////////////////////////////////////////////////////////////////////
	
	m_hModule = ::LoadLibrary(pszModName);
	if(m_hModule == NULL)	{ 	m_pfnOrig = NULL; return; }
	//从模块中得到这个函数的地址
	m_pfnOrig = ::GetProcAddress(m_hModule, pszFuncName);
	// 修改原API函数执行代码的前8个字节,使它跳向我们的函数
	if (m_pfnOrig == NULL)
	{
		m_pfnOrig = NULL; return;
		
	}
	//////////////////////////////////////////////////////////////////////////
	
	BYTE btNewBytes[8] = { 0xB8, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xE0, 0x00 }; 
	memcpy(m_btNewBytes, btNewBytes, HOOKLEN);
	
	*(DWORD *)(m_btNewBytes + 1) = (DWORD)pfnHook; 
	if(m_pfnOrig != NULL)
	{
		DWORD dwOldProtect;
		MEMORY_BASIC_INFORMATION    mbi;
		::VirtualQuery( m_pfnOrig, &mbi, sizeof(mbi) );
		::VirtualProtect(m_pfnOrig, HOOKLEN, PAGE_READWRITE, &dwOldProtect);
		
		memcpy(m_btOldBytes, m_pfnOrig, HOOKLEN);
		
		::WriteProcessMemory(::GetCurrentProcess(), (void *)m_pfnOrig, 
			m_btNewBytes, HOOKLEN, NULL); 
		
		::VirtualProtect(m_pfnOrig, HOOKLEN, mbi.Protect, 0);
	}
	
}

void  SetAPIHook2(LPSTR pszModName, LPSTR pszFuncName, PROC pfnHook)
{
	//1:修改头五字节跳走
	//2:将入口后品五字字复制 
	//3自己的函数
}
 


//////////////////////////////////////////////////////////////////////////